热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

都会|开支_MySQL主从复制及读写分离实际部署与验证

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL主从复制及读写分离实际部署与验证相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL主从复制及读写分离实际部署与验证相关的知识,希望对你有一定的参考价值。



mysql主从复制及读写分离


    • 前言:

  • 一、主从复制
    • 1.原理:
    • 2.准备来做主从复制和读写分离的服务器如下:
    • 3.主从复制具体步骤
      • 1.关闭所有服务器的防火墙
      • 2.Mysql主从服务器都进行时间同步
      • 3.主从服务器mysql配置
      • 4.从服务器的mysql配置
      • 5.Mysql主从复制的效果


  • 二、读写分离
    • 1.原理:
    • 2.读写分离的方案
      • 2.1基于程序代码内部实现
      • 2.2 基于中间代理层实现

    • 3.读写分离的拓扑图
    • 4.操作思路
    • 5.具体搭建mysql读写分离操作:
      • amoeba服务器
      • 1 安装java jdk1.6环境
      • 2 安装amoeba软件
      • 3 在主从服务器上的mysql分别授权
      • 4 配置 Amoeba读写分离,两个 Slave 读负载均衡
      • 5 修改amoeba配置文件
      • 6 修改数据库配置文件
      • 7 客户端操作
      • 8 在客户端上创建登录代理服务器amoeba访问mysql
      • 9读写分离测试:


  • 三、总结:
    • 1.主从复制里三个线程两个日志
    • 2.读写分离
      • 优点




前言:

在现网生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,一般来说 都是通过主从复制(Master-Slave)来同步数据,再通过读写分离来提升数据库并发负载能力的方案来进行部署与实施


一、主从复制

1.原理:


主MySQL服务器做的修改,都会通过dump线程写入自己的二进制日志(Binary log) ,然后 ,从MySQL服务器通过自己的I/O线程 连接主服务器,进行读取主服务器的二进制日志,备份写入到从服务器的中继日志(Relay log) 当中,然后从服务器通过SQL线程 ,将中继日志中的数据重放到自己的服务器中,复制完成。
a

这里有三个进程两个日志需要着重理解


  • dump线程:master服务器上,记录所有更改的线程。
  • I/O线程:从服务器上用来读取、备份到从服务器上的中继日志的进程。
  • SQL线程:从服务中读取中继日志写入自身变化的进程。
  • 二进制文件:主服务器上记录更新的日志
  • 中继日志文件:由主服务器上下载下来放在从服务器上记录的。

2.准备来做主从复制和读写分离的服务器如下:


服务器IP地址所需的软件
Master192.168.40.50ntp 、 mysql-boost-5.7.20.tar.gz
slave 1192.168.40.60ntp 、ntpdate 、 mysql-boost-5.7.20.tar.gz
slave 2192.168.40.61ntp 、ntpdate 、 mysql-boost-5.7.20.tar.gz
amoeba192.168.40.80jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz
client192.168.40.88mysql-boost-5.7.20.tar.gz

3.主从复制具体步骤


1.关闭所有服务器的防火墙


2.Mysql主从服务器都进行时间同步

在末行添加


开启服务

从服务器设置时间同步(192.168.40.60 和192.168.40.61)

yum -y install ntp ntpdate
service ntpd start
/usr/sbin/ntpdate 192.168.40.50 #进行时间同步,指向Master服务器IP
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.184.50




3.主从服务器mysql配置

vim /etc/my.cnf
server-id = 1
log-bin=master-bin #添加,主服务器开启二进制日志
log-slave-updates=true #添加,允许从服务器更新二进制日志
systemctl restart mysqld
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'one'@'192.168.40.%' IDENTIFIED BY '123123'; #给从服务器授权
FLUSH PRIVILEGES;
show master status\\G;
#File 列显示日志名,Fosition 列显示偏移量




4.从服务器的mysql配置

vim /etc/my.cnf
server-id = 2 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #添加,定义中继日志文件的位置和名称
systemctl restart mysqld
mysql -u root -p
change master to master_host='192.168.40.50' , master_user='one',master_password='123123',master_log_file='master-bin.000001',master_log_pos=843;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致,这里的是例子,每个人的都不一样
start slave; #启动同步,如有报错执行 reset slave;
show slave status\\G #查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程




5.Mysql主从复制的效果

我们可以看到在开启主从复制的时候,从服务器上能够查询到主服务器的数据库信息。

我们把slave1的主从关掉后,再去master服务器上进行数据库信息的增加。

再去slave1 上查看数据库内容,发现数据不同步。


我们再次打开从服务器的start slave,可以发现从服务器上的数据又从主服务器上同步过来了。


二、读写分离

1.原理:

读写分离基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
简单的来说三点:


  • 只在主服务器上写,只在从服务器上读。
  • 主数据库处理事务性查询,而从数据库处理 select 查询。
  • 数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。

2.读写分离的方案


2.1基于程序代码内部实现

在代码中根据select. insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支:缺点是需要开发人员来实现,运维人员无从下手。


2.2 基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数据库,有两个代表性程序。
(1) MySQL-Proxy。MySQL- -Proxy为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL官方并不建议将MySQL- -Proxy 用到生产环境。
(2) Amoeba (变形虫)。由陈思儒开发,其曾就职于阿里巴巴。该程序用Java语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。
经过上述简单的比较,通过程序代码实现MySQL读写分离自然是一个不错的选择, 但是并不是所有的应用都适合在程序代码中实现读写分离,例如一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种大型复杂的应用一般会考虑使用代理层来实现。


  • Amoeba是一个非常容易使用,可移植性非常强的软件,因此它在生产环境中被广泛用于数据库的代理层。

3.读写分离的拓扑图


4.操作思路


5.具体搭建mysql读写分离操作:


amoeba服务器

amoeba (192.168.40.80)


1 安装java jdk1.6环境

因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
将jdk-6u14-linux-x64.bin 和 amoeba-mysql-binary-2.2.0.tar.gz.0 上传到/opt目录下。


切换至cd /usr/local目录下
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
按空格到最后一行
按yes,按enter
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile
java -version




2 安装amoeba软件



3 在主从服务器上的mysql分别授权


这里是第二个账户我们用two表示,是amoeba登录主从的账户权限
grant all on *.* to 'two'@'192.168.40.%' identified by '123123';




4 配置 Amoeba读写分离,两个 Slave 读负载均衡

amoeba服务器:192.168.40.80


5 修改amoeba配置文件




6 修改数据库配置文件


cp dbServers.xml dbServers.xml.bak
vim dbServers.xml
#---------23注释掉--------------------------------------
作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- mysql schema
<property name&#61;"schema">test</property>
-->
#---------26修改-----------------------------------------
<!-- mysql user -->
<property name&#61;"user">two</property>
#---------28-30去掉注释----------------------------------
<property name&#61;"password">123123</property>
#---------45修改&#xff0c;设置主服务器的名Master------------------
<dbServer name&#61;"master" parent&#61;"abstractServer">
#---------48修改&#xff0c;设置主服务器的地址----------------------
<property name&#61;"ipAddress">192.168.40.50</property>
#---------52修改&#xff0c;设置从服务器的名slave1-----------------
<dbServer name&#61;"slave1" parent&#61;"abstractServer">
#---------55修改&#xff0c;设置从服务器1的地址---------------------
<property name&#61;"ipAddress">192.168.40.60</property>
#---------58复制上面6行粘贴&#xff0c;设置从服务器2的名slave2和地址---
<dbServer name&#61;"slave2" parent&#61;"abstractServer">
<property name&#61;"ipAddress">192.168.40.61</property>
#---------修改后的65或66修改-------------------------------------
<dbServer name&#61;"slaves" virtual&#61;"true">
#---------71修改----------------------------------------
<property name&#61;"poolNames">slave1,slave2</property>
/usr/local/amoeba/bin/amoeba start& #启动Amoeba软件&#xff0c;按ctrl&#43;c 返回
netstat -anpt | grep java #查看8066端口是否开启&#xff0c;默认端口为TCP 8066







7 客户端操作

client&#xff1a; 192.168.40.88

使用yum快速安装MySQL虚拟客户端


8 在客户端上创建登录代理服务器amoeba访问mysql

yum install -y mysql mysql-server
mysql -u three -p123123 -h 192.168.40.80 -P8066


9读写分离测试&#xff1a;

测试思路&#xff1a;


  • 已知读写分离是通过slave服务器去读&#xff1b;修改&#xff0c;变更通过master服务器写入。
  • 因此我们断开主从&#xff0c;直接在master写入数据&#xff0c;再通过客户端直接读取数据库&#xff0c;看是否读取到变更。
  • 读不到则说明读取数据库不是直接从master&#xff0c;再在从服务器上写入数据&#xff0c;再在客户端查询是否变更&#xff0c;如果变更&#xff0c;则说明&#xff0c;客户端通过amoeba代理读取数据库是从slave上读取的&#xff0c;和master无关。





在slave1上插入数据

insert into aa values(11,&#39;slave1&#39;);


在slave2上插入数据

insert into aa values(22,&#39;slave2&#39;);

在master上插入数据

insert into aa values(33,&#39;master33&#39;);


再在客户端写入

insert into aa values(44,&#39;cilent&#39;);

我们通过在client上直接查询数据库可以看到&#xff0c;我在本地写入的44数据查不到&#xff0c;只能轮询查到slave上的数据。


  • 打开master进行查询&#xff0c;可以看到可以看到 client 上写入的数据&#xff0c;这里即可以说明 写入写到master里&#xff0c;读取是从slave上轮询读取。






    主从复制&#43;读写分离成功

三、总结&#xff1a;

1.主从复制里三个线程两个日志


  • dump线程&#xff1a;master服务器上&#xff0c;记录所有更改的线程。
  • I/O线程&#xff1a;从服务器上用来读取、备份到从服务器上的中继日志的进程。
  • SQL线程&#xff1a;从服务中读取中继日志写入自身变化的进程。
  • 二进制文件&#xff1a;主服务器上记录更新的日志
  • 中继日志文件&#xff1a;由主服务器上下载下来放在从服务器上记录的。


2.读写分离

slave服务器提供读取功能
master服务器提供写入功能


优点

提高用户体验


推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
author-avatar
马先生2502911467
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有